﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

using RESTProcesosMCService.Dominio;
using RESTProcesosMCService.Persistencia;
using System.ServiceModel.Web;
using System.Net;

using System.Messaging;

namespace RESTProcesosMCService
{
    // NOTA: puede usar el comando "Rename" del menú "Refactorizar" para cambiar el nombre de clase "ClientesMCService" en el código, en svc y en el archivo de configuración a la vez.
    public class ClientesMCService : IClientesMCService
    {
        private ClienteMCDAO dao = new ClienteMCDAO();

        public Dominio.ClienteMC ValidarClienteMC(Dominio.ClienteMC ClienteMCACrear)
        {
            //Descomentar esto para efectos de prueba....Simulación de que el servicio no se encuentr activo.
            //throw new WebFaultException(HttpStatusCode.Unauthorized);

            ClienteMC ClienteMCExiste = ObtenerClienteMC(ClienteMCACrear.dni.ToString());

            if (ClienteMCExiste == null)
            {
                //Si el Cliente no Existe, entonces lo registramos.
                ClienteMCACrear = dao.Crear(ClienteMCACrear);
                return ClienteMCACrear;
            }
            else {
                //Si el Cliente Existe, entonces devolvemos el que existe.
                return ClienteMCExiste;
            }

        }

        public Dominio.ClienteMC ObtenerClienteMC(string dni)
        {
            return dao.Obtener(dni);
        }

        public List<Dominio.ClienteMC> ListarClientesMC()
        {
            List<ClienteMC> listaCliente = null;
            string rutaCola = @".\private$\ClientesMC";
            if (!MessageQueue.Exists(rutaCola))
                MessageQueue.Create(rutaCola);

            MessageQueue cola = new MessageQueue(rutaCola);

            int nroMensajes = cola.GetAllMessages().Count();
            while (nroMensajes > 0)
            {

                cola.Formatter = new XmlMessageFormatter(new Type[] { typeof(ClienteMC) });
                Message mensaje2 = cola.Receive();
                ClienteMC MQClienteMC = (ClienteMC)mensaje2.Body;

                ClienteMC ClienteMCExiste = ObtenerClienteMC(MQClienteMC.dni.ToString());
                if (ClienteMCExiste == null)
                {
                    ClienteMC ClienteMCACrear = new ClienteMC();
                    listaCliente = new List<ClienteMC>();
                    ClienteMCACrear.dni = MQClienteMC.dni;
                    ClienteMCACrear.apellidoMaterno = MQClienteMC.apellidoMaterno;
                    ClienteMCACrear.apellidoPaterno = MQClienteMC.apellidoPaterno;
                    ClienteMCACrear.direccion = MQClienteMC.direccion;
                    ClienteMCACrear.nombre = MQClienteMC.nombre;
                    ClienteMCACrear.tarjeta = MQClienteMC.tarjeta;
                    ClienteMCACrear.lineaCredito = MQClienteMC.lineaCredito;
                    listaCliente.Add(ClienteMCACrear);
                    dao.Crear(ClienteMCACrear);
                }
                nroMensajes = cola.GetAllMessages().Count();
            }
            if (nroMensajes > 0)
            {
                return dao.ListarTodos();
            }
            else
            {
                return listaCliente;
            }
            
        }
    }
}
